#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

#define PATH "/home/china"
#define PROJ_ID 123456
/*
    int semget(key_t key, int nsems, int semflg):
        根据key，创建/打开一个信号量集
        并指定信号量的数量nsems
    int semctl(int semid, int semnum, int cmd, ...)：
        控制操作，根据创建/打开的信号量集
        指名从哪个semnum开始
        cmd：
            SETALL（设置信号量集）  +要指定的参数数组
            GETALL（ 获取信号量集   +要获取的参数数组
            IPC_RMID（删除信号量集）
*/
int main()
{
    //1.创建key
    key_t key = ftok(PATH, PROJ_ID);
    if (key == -1)
    {
        perror("ftok error");
        return -1;
    }

    //2.创建一个共享内存
    int semid = semget(key, 5, IPC_CREAT | 0777);
    if (semid == -1)
    {
        perror("semget error");
        return -1;
    }

    //3.控制操作
    //初始化信号量集
    unsigned short val[5] = { 1,2,3,4,5 };
    int r = semctl(semid, 0, SETALL, val);
    if (r == -1)
    {
        perror("semctl setall error");
        return -1;
    }

    //获取所有信号量的值
    unsigned short value[5] = { 0 };
    r = semctl(semid, 0, GETALL, value);
    if (r == -1)
    {
        perror("semctl getall error");
        return -1;
    }

    for (int i = 0;i < 5;i++)
    {
        printf("sem[%d]=>%d\n", i, value[i]);
    }

    //5.删除信号量集
    semctl(semid, 0, IPC_RMID);
}
